#include "./BSP/LED/led_manager.h"

/* -------------------------------------------- LED IO初始化 -------------------------------------------- */

/**
 * @brief       初始化LED相关IO口, 并使能时钟
 * @param       无
 * @retval      无
 */
static void InitLedIo(void)
{ 
    GPIO_InitTypeDef gpio_init_struct;
    
    /*开启时钟*/
    LED0_GPIO_CLK_ENABLE();                             /* LED0时钟使能 */
    LED1_GPIO_CLK_ENABLE();                             /* LED1时钟使能 */
    
    /*GPIO初始化*/
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;        /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* 高速 */

    gpio_init_struct.Pin = LED0_GPIO_PIN;               /* LED0引脚 */
    HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct);   /* 初始化LED0引脚 */

    gpio_init_struct.Pin = LED1_GPIO_PIN;               /* LED1引脚 */
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);   /* 初始化LED1引脚 */
    
    gpio_init_struct.Pin = LED2_GPIO_PIN;               /* LED2引脚 */
    HAL_GPIO_Init(LED2_GPIO_PORT, &gpio_init_struct);   /* 初始化LED2引脚 */
    
    /*设置GPIO初始化后的默认电平*/
    LED0(1);                                            /* 关闭 LED0 */
    LED1(1);                                            /* 关闭 LED1 */
    LED2(1);                                            /* 关闭 LED2 */
}

/* -------------------------------------------- LED控制函数 -------------------------------------------- */

/**
 * @brief       控制LED0状态
 * @param       state: LED状态，COT_LED_ON-开，COT_LED_OFF-关
 * @retval      无
 */
void CtrlLed0(cotLedState_e state)
{
    state == COT_LED_ON ? HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET) : HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET);
}

/**
 * @brief       控制LED1状态
 * @param       state: LED状态，COT_LED_ON-开，COT_LED_OFF-关
 * @retval      无
 */
void CtrlLed1(cotLedState_e state)
{
    state == COT_LED_ON ? HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET) : HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET);
}

/**
 * @brief       控制LED2状态
 * @param       state: LED状态，COT_LED_ON-开，COT_LED_OFF-关
 * @retval      无
 */
void CtrlLed2(cotLedState_e state)
{
    state == COT_LED_ON ? HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_RESET) : HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_SET);
}

/* -------------------------------------------- LED模块API函数 -------------------------------------------- */

/**
 * @brief       LED初始化函数
 * @param       无
 * @retval      无
 */
void FML_LED_Init(void)
{
    static cotLedCfg_t s_ledTable[LED_MAX_NUM] = 
    {
        {.pfnLedCtrl = CtrlLed0},
        {.pfnLedCtrl = CtrlLed1},
        {.pfnLedCtrl = CtrlLed2},
    };

    InitLedIo();
    cotLed_Init(s_ledTable, LED_MAX_NUM);
}
